利用云服务器搭建个人的Web站点
作为web开发相关的程序员,在时间和精力充裕的条件下,可以利用云主机搭建一个自己的博客或开源项目,同时也可作为自己的测试环境,在上面做一些试验性的研究,甚至可以作为自己上网的代理服务器。
总之,好处还是挺多的,也能熟悉整个运维的流程和Linux系统的操作命令,收获成功的体验。
本文,我们使用阿里云的云主机ECS(可伸缩弹性计算服务)为例,搭建一个Web站点。
云主机的配置选择
根据个人的喜好以及业务需求,选择相应的云主机配置。国内比较知名的云主机服务商:阿里、腾讯、华为、电信天翼等都可以的。尽量选择大品牌的云计算服务上,毕竟技术实力强悍,稳定性有保证。
我是选择的老牌的阿里云主机,本着能省则省的原则,选择了最便宜的一款ECS。
选择配置时需要注意的点
付费类型选啥?
- 如果是使用频繁,每天都会用到,选择包月的套餐比较划算。
- 如果只是学习,研究,搭建一下个人站点,平时用的少,就选择
按量付费
地域选啥
- 如果没有访问外网的需求,就是国内的客户,不需要访问谷歌、Facebook等的服务的话,选择大陆的云主机就可以的。
- 如果想访问外部的技术网站,搭建上网代理的话,就选择
香港
的云主机
实例选啥
完全根据自己的需求了,资金充裕的话,就选择高配置的(CPU、内存、磁盘等),当然是参数越高,服务器的性能越好,使用也就越流畅了。
镜像选啥
镜像就是给云主机安装的操作系统及预置环境了。建议选择自己所熟悉的OS,比如平时的业务开发是centos,就选择CentOS的镜像,尽量选择最新的版本。
如果无所谓了,那就选择官方推荐的默认选型:Alibaba Cloud Linux,维护也很及时,Bug少,质量有保障的。
选择公网IP吗?
这个就看个人的需求了,选择了固定的公网IP,上网速度有保证,同时每月要固定支出价格不菲的流量费。
也可不选公网IP,后期创建好实例后,绑定一个弹性公网IP,走按量付费的模式,也很方便灵活的。
弹性IP是云服务提供商(如AWS、阿里云等)提供的一种用于云主机的静态IP地址,可以在云主机启动/关闭时进行分配和释放。而公网IP是由Internet服务提供商(如电信、移动等)分配给用户的静态IP地址,弹性IP具有更高的灵活性和可管理性,适用于动态的云计算环境,而公网IP则适用于需要静态公网IP的传统IT环境。
登录凭证选啥
- 针对小白用户,不熟悉Linux系统的操作的话,建议选择 密码模式
- 针对老程序员,熟系Linux 运维的话,使用官方推荐的 密钥对
两则差别在于登录认证的方式,对后面的操作没有太大影响的。
当选好适合自己的配置后,就可以下单了,这样进入云主机的控制台页面,就能看到自己购买的实例了。
上面是我选购的两台实例,配置都不高的。其中弹性公网IP的实例
就是香港的那台ECS,走的是按量付费的模式,自己使用了多少网络流量,就花费多少钱;固定公网IP的实例
就是北京的那台云主机,走的是包月付费的模式。
首次登录设置
购买好云主机后,就可以登录进去了,首次登录利用官方的Web控制台提供的入口进行登录。
登录过程,比较简单,应该不会遇到什么阻碍的。如果首次设置的秘钥登录,还想添加密码登录
的方式也很简单。
开启本地SSH访问
首次登录到云主机后,进入到shell命令行环境,默认是root目录,下面什么文件也没有。
- 我们输入
ls -lah
显示出隐藏的文件夹 - 进入到 .ssh目录下,
cd .ssh
- 发现了 authorized_keys文件(里面存放SSH的公钥)
- 我们将自己本地目录下的公钥key(一般是id_rsa.pub文件)的内容,拷贝到
authorized_keys
文件里面 - 然后保存即可。
然后,我们本地测试一下,打开本地系统的命令行环境。输入ssh root@服务器的IP
。
这样就顺利在本地命令行中,通过SSH的方式登录远程的阿里云服务器了。
关于上面说的如何打开,修改 authorized_keys文件?
需要用到Linux的 vi命令。
vi authorized_keys # 打开 authorized_keys 文件,
enter i # 进入编辑模式
# 将本地的 id_rsa.pub文件 中的内容,拷贝到里面
enter esc # 退出编辑模式
enter :wq # 保存并关闭 authorized_keys 文件
vi authorized_keys # 打开 authorized_keys 文件,
enter i # 进入编辑模式
# 将本地的 id_rsa.pub文件 中的内容,拷贝到里面
enter esc # 退出编辑模式
enter :wq # 保存并关闭 authorized_keys 文件
以上步骤,就完成了对远程服务器上的authorized_keys
文件的修改。
authorized_keys
文件里面存放的是允许登录该云主机的所有SSH公钥,可以放置多条记录,这样就能允许多人多客户机访问了。
每次输入IP比较麻烦,我们可以设置一个云主机的别名。
- 进入到本地的
/${user}/.ssh
目录下 - 找到 config 文件,添加云主机的相关信息
Host hk-ecs
AddKeysToAgent yes
UseKeychain yes
HostName 8.0.0.24
User root
Port 22
IdentityFile ~/.ssh/id_rsa
Host hk-ecs
AddKeysToAgent yes
UseKeychain yes
HostName 8.0.0.24
User root
Port 22
IdentityFile ~/.ssh/id_rsa
ssh root@hk-esc # 快捷访问了
ssh root@hk-esc # 快捷访问了
这样就能通过 hk-esc 指向真实的IP地址来快捷访问了。
除此之外,也能在zsh的配置(vi ~/.zshrc)通过设置别名的方式。
alias hk="ssh root@hk-ecs"
alias hk="ssh root@hk-ecs"
这样仅需要输入 hk
就能访问远在香港的云主机了。
hk # 相当于 ssh root@hk-ecs => ssh root@ip
hk # 相当于 ssh root@hk-ecs => ssh root@ip
开启密码登录
先用可以登录的方式,进入到远程主机的shell命令行中。
cat /etc/ssh/sshd_config
cat /etc/ssh/sshd_config
如下图所示,PasswordAuthentication参数设置为no,表示禁止以密码方式登录,需要修改为yes
重启 sshd 服务
service sshd restart
service sshd restart
搭建Web服务
进入正题,想要搭建自己的个人站点,先要安装一个web服务器软件,常用的有Apache、nginx。这里我们选择更轻量、高效的Nginx作为 Web服务。
- 安装 Nginx,利用远程主机自带的
yum
命令非常方便。 - yum install nginx
- 设置Nginx,修改相应的配置
安装完成后,查看安装版本。
nginx -v # 查看安装版本,输出下面的信息
# nginx version: nginx/1.20.1
nginx -v # 查看安装版本,输出下面的信息
# nginx version: nginx/1.20.1
输出版本信息,说明安装成功,找到Nginx的配置文件,按需修改。
nginx -t # 查看 和 检查Nginx的配置是否正确,输出下面的信息
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
vi /etc/nginx/nginx.conf # 设置相关的配置
nginx -t # 查看 和 检查Nginx的配置是否正确,输出下面的信息
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
vi /etc/nginx/nginx.conf # 设置相关的配置
比如,要设置Nginx的资源发布目录。
server {
root /root/web-site/; # 默认为: /usr/share/nginx/html
}
server {
root /root/web-site/; # 默认为: /usr/share/nginx/html
}
完成自己的设置后,保存 nginx.conf 文件,启动 Nginx 服务
nginx # 启动默认配置文件下的Nginx服务,后面也可跟各种参数的
nginx -s reload # 重新加载配置文件,每次修改配置后,要执行该命令
nginx -s stop # 停止Nginx服务
nginx # 启动默认配置文件下的Nginx服务,后面也可跟各种参数的
nginx -s reload # 重新加载配置文件,每次修改配置后,要执行该命令
nginx -s stop # 停止Nginx服务
我们首先在 远程主机上访问一下。出现下面的界面,说明Nginx服务正常启动了。
curl http://localhost # 会出现下图所示的界面
curl http://localhost # 会出现下图所示的界面
然后,打开本地的浏览器,输入 远程服务器的IP地址
看到上面的测试页面,说明我们的个人站点的Web服务已经调通了,支持远程访问了。
如果无法访问,出现下面的情况,说明是ECS的防火墙屏蔽了 80
端口
登录 到云主机的Web控制台,添加安全组的规则,允许访问ECS的 80 端口服务
如果出现下面的,403 错误❌,则有可能是服务端的权限问题,Nginx未能正确启动。
这是,需要到服务器上查看Nginx的配置,一般是由于权限问题导致的。
查看系统的Nginx进程,发现 master 进程 和 worker 进程不是一个用户模式,master 是 root用户,worker 是 nginx 用户。
比如,这里我们设置了在发布目录为:/root/web-static
,由于是root目录下,我们最好把Nginx的进程改成 root 用户启动模式。修改如下的配置:
user root; #修改前是 nginx
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
user root; #修改前是 nginx
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
nginx -s reload
nginx -s reload
重新加载 Nginx的配置,再次查看 Nginx的实例进程,就会发现 master 进程 和 worker 都是由 root 用户控制的了。
访问浏览器,进一步测试,也是没有问题的了。
同步本地文件
我们开发了一个web页面,如何上传到云主机,完成Web资源的更新呢?
如果每次手动上传太麻烦了,耗时耗力,还容易出错。其实有多种同步方式,比如搭建FTP服务,使用ftp的上传方式,或者借助 rz
命令上传。
- 搭建FTP服务有点儿大费周章,还要再开启一个文件服务,增加端口配置等一些列操作
- 使用
rz
命令手动上传文件,太慢了,当同时修改了多个文件时效率低,且不支持上传目录
我们这里使用一种比较快捷高效的方式,直接在项目的开发工具VS-code中安装一个插件SFTP,它能帮我们自动将本地的文件目录同步到远程服务器。(使用其它IDE的同学,可以找找有无类似的插件了)
给插件,添加远程服务器的相关参数,在项目的根目录下会生成 .vscode/sftp.json
文件
{
"name": "ALI Cloud ECS HongKong Server",
"host": "8.0.0.0", // 换成您真实的云主机IP
"protocol": "sftp",
"port": 22,
"username": "root", // 远程主机的访问账户
"remotePath": "/root/web-site", // 远程服务器上要同步的目录
"uploadOnSave": false,
"useTempFile": true,
"openSsh": true,
"privateKeyPath": "/Users/hoke/.ssh/id_rsa", // SSH 私钥的路径
"syncOption": {
"delete": true // 同步选项,本地文件删除后,远程服务上也一并删除
},
"ignore": [ // 忽略同步的文件
".vscode",
".git",
".DS_Store",
".mp4"
]
}
{
"name": "ALI Cloud ECS HongKong Server",
"host": "8.0.0.0", // 换成您真实的云主机IP
"protocol": "sftp",
"port": 22,
"username": "root", // 远程主机的访问账户
"remotePath": "/root/web-site", // 远程服务器上要同步的目录
"uploadOnSave": false,
"useTempFile": true,
"openSsh": true,
"privateKeyPath": "/Users/hoke/.ssh/id_rsa", // SSH 私钥的路径
"syncOption": {
"delete": true // 同步选项,本地文件删除后,远程服务上也一并删除
},
"ignore": [ // 忽略同步的文件
".vscode",
".git",
".DS_Store",
".mp4"
]
}
添加完上面的配置后,在项目工程的某个目录上右键菜单,会出现同步选项。
这样就能高效实现远程Web资源的及时更新了。
动态服务
如果个人的站点涉及到了动态服务,比如用户评论,投票,留言等需要和Web后台打交道的部分,则需要搭建相应的动态服务了。 可以用Java、PHP、NodeJS等后端语言,同时安装MySQL或MongoDB这样的数据库软件。
yum install nvm # 通过 nvm 管理nodejs的版本
nvm install node@18 # 安装nodejs
yum install mysql # 安装MySQL数据库
yum install nvm # 通过 nvm 管理nodejs的版本
nvm install node@18 # 安装nodejs
yum install mysql # 安装MySQL数据库
设置 Nginx 的代理转发,将带 /api
的请求都转到后端的服务上去,否则请求相应的资源文件。这里假设,您又在服务器上部署了一套后台的数据接口服务,发布在 8080端口上。
location /api { ## 后台服务
proxy_pass http://127.0.0.1:8080;
}
location / { ## 静态资源
root /root/web-site/;
index index.html index.htm;
}
location /api { ## 后台服务
proxy_pass http://127.0.0.1:8080;
}
location / { ## 静态资源
root /root/web-site/;
index index.html index.htm;
}
也可将相应的原始请求头,一并转发过去,便于做后续的日志分析。
location /api/ { ## 后台服务
proxy_pass http://127.0.0.1:7001;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
location /api/ { ## 后台服务
proxy_pass http://127.0.0.1:7001;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
配备域名
通过IP地址,自己使用也还好。如果想对外提供服务,比如是自己的博客,直接用IP地址,一是不容易被人记住,二是不容易被搜索引擎收录。有自己的域名的话,易于积累长期的品牌效应。
申请域名的话,也可以使用阿里云的,或者万网这样的域名提供商,选择一个合适的域名,购买即可。购买完成后,就能见到如下图所示的界面了(我这里购买了两个域名,所以有两条记录)。
域名申请下来后,就要添加解析了,如果要将域名解析到国内(大陆的云主机)就得进行域名备案了,需要实名认证,进行各项资料的报备,然后是管理局的审核,流程比较长,周期漫长(全程大约20天),需要耐心等待的。
这里推荐将个人站点,解析到香港的云主机上,这样就省去了一系列的审核备案的流程了,节省时间。
域名解析设置很简单,如上图所示,只要绑定自己的云主机公网IP(固定公网IP和弹性公网IP都行的)即可。
搭建上网代理服务
如果我们购买的是香港的云主机,可以借此再搭建一个上网代理的服务,这样就能通过代理访问国外的一些网站了,比如很多程序员都会用到的Google、GitHub、homebrew等。
步骤也很简单,主要是安装一个代理服务软件 squid
yum install squid
yum install squid
- 安装 squid 代理服务软件
- 修改配置:vim /etc/squid/squid.conf => 允许客户端访问
- 添加防火墙的规则,允许 squid 服务的 3128端口通过
- 重启 squid 服务:
systemctl restart squid
这里我们说一下,squid的关键配置
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow all
# Squid normally listens to port 3128
http_port 3128
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow all
# Squid normally listens to port 3128
http_port 3128
http_access allow
允许访问代理服务器的客户端有哪些,就是说哪些客户端能够使用服务,避免被非法入侵或蹭网。
http_port 3128
是需要我们在防火墙中,设置放行的端口,否则本地无法使用代理服务的。
经过上面的步骤,就成功设置好代理服务器了。同时本地的电脑上添加,代理服务器的地址和端口就行了。
我本地用的是苹果电脑Mac系统,代理设置效果如上图。本地设置好后,我们验证一下效果。
可以看到上网出口,已经变成了香港的IP地址了。
总结
使用远程的云主机,可以给我带来很多的便利,方便我们进行研究试验,相当于是多了一台不会关机的电脑。 平时,我们可以将自己的业余项目部署在上面跑,或者将总结的文章搭建成博客的形式,持续的输出能让自己成长的更快。
在使用远程ECS的时候,要注意安全,设置好防火墙策略,关闭不必要的上行端口。如果资金不充裕的情况,就选择一个低配的服务器,走按量付费的模式。